package main

import (
	"fmt"
	"sync"
	"sync/atomic"
	"time"
)

type AtomicInt32 int32

func (a *AtomicInt32) CompareAndSwap(old, new int32) bool {
	return atomic.CompareAndSwapInt32((*int32)(a), old, new)
}

func main() {
	var value AtomicInt32 = 10
	num := int32(999) // 使用int32类型以确保原子操作
	wg := sync.WaitGroup{}
	wg.Add(10)
	for i := 0; i < 10; i++ {
		go func(i, try int) {
			defer wg.Done()
			// 尝试进行CAS操作
			// 没有获取到锁并且尝试次数大于10次协程退出
			for ; !value.CompareAndSwap(10, 20) && try >= 0; try-- {
				fmt.Println("CAS failed :", i)
				time.Sleep(100 * time.Millisecond) // 使用更短的休眠时间
				return
			}
			//获取到cas锁数据+1
			fmt.Println("CAS success :", i)
			atomic.AddInt32(&num, 1) // 使用原子操作增加num的值
		}(i, 10)
	}
	wg.Wait() // 等待所有协程完成
	fmt.Println(num)
}
